package org.calrissian.restdoclet.example.spring;

/**
 * facade接口调用结果包装器
 *
 * @author wanglong
 * @version $Id: FacadeInvokeDataResult.java, v 0.1 2016年6月17日 下午5:44:19 wanglong Exp $
 */
public class FacadeInvokeDataResult<T> {

    protected static final String DEFAULT_EXCEPTION_CODE    = "UNDEFINED_ERROR";
    protected static final String DEFAULT_EXCEPTION_MESSAGE = "系统异常";

    /**
     * 请求是否执行成功
     */
    protected boolean             success;

    /**
     * 异常提示信息（成功请求返回为空）
     */
    protected String              errorMessage;

    /**
     * 异常代码（成功请求返回为空）
     */
    protected String              errorCode;

    /**
     * 数据
     */
    protected T                   data;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    /**
     * 获取成功且不带数据的结果实例
     *
     * @return
     */
    public static FacadeInvokeDataResult success() {
        FacadeInvokeDataResult result = new FacadeInvokeDataResult();
        result.success = true;
        return result;
    }

    /**
     * 获取成功且带数据的结果实例
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> FacadeInvokeDataResult<T> success(T data) {
        FacadeInvokeDataResult<T> result = new FacadeInvokeDataResult<T>();
        result.success = true;
        result.data = data;
        return result;
    }

    /**
     * 获取指定异常代码和消息的失败结果实例
     *
     * @param errorCode
     * @param errorMessage
     * @return
     */
    public static FacadeInvokeDataResult failure(String errorCode, String errorMessage) {
        FacadeInvokeDataResult result = new FacadeInvokeDataResult();
        result.success = false;
        result.errorCode = errorCode;
        result.errorMessage = errorMessage;
        return result;
    }

    /**
     * 获取指定异常的失败结果实例
     * 如果异常为SystemException,则直接使用异常代码与消息;
     * 否则异常代码为UNDEFINED_ERROR,异常消息为:"系统异常"
     *
     * @param t
     * @return
     */
    //    public static FacadeInvokeDataResult failure(Throwable t) {
    //        FacadeInvokeDataResult result = new FacadeInvokeDataResult();
    //        if (t instanceof SystemException) {
    //            SystemException se = (SystemException) t;
    //            result.success = false;
    //            result.errorCode = se.getErrorCode();
    //            result.errorMessage = se.getErrorMessage();
    //        } else {
    //            result.success = false;
    //            result.errorCode = DEFAULT_EXCEPTION_CODE;
    //            result.errorMessage = DEFAULT_EXCEPTION_MESSAGE;
    //        }
    //        return result;
    //    }

    /**
     * 获取指定异常代码和消息的失败结果实例
     *
     * @param errorCode
     * @param errorMessage
     * @return
     */
    public static <T> FacadeInvokeDataResult<T> failure(String errorCode, String errorMessage,
                                                        T data) {
        FacadeInvokeDataResult<T> result = new FacadeInvokeDataResult<>();
        result.success = false;
        result.errorCode = errorCode;
        result.errorMessage = errorMessage;
        result.data = data;
        return result;
    }

}
